بعد از عمل تنظیم (initialization) نشاندهنده آماده استفاده است. زمانهای داده شده در لیست تقریبی هستند و ممکن است برای بعضی از نشاندهندهها کافی نباشد. در این صورت باید مقدار تاخیرات را بیشتر در نظر بگیرید. ارتباط بصورت روش 8-بیتی احتیاج به توضیح ندارد و آسانترین روش است.
زمان اینترفیس 4-بیتی: در روش 4-بیتی هم تنها تفاوت اینست که یک بایت را باید در دو قسمت با دو سیگنال E ارسال کرد. برای استفاده یک روش این است که تمام خطوط داده(D7...D0) و کنترل (RS/RW/E) را به میکروکنترولر وصل کنیم. این روش دارای سرعت بالا برای تبادل داده است ولی 11 پایه از میکروکنترولر مصرف میشود. روش دیگر بصورت سریال است دستورهای السیدی و توضیحات آن: کنترل LCD توسط shift register: بیشتر مواقع ما برای کنترل نشاندهنده پایهها با اتصالات کافی در میکروکنترلر نداریم, در این مواقع استفاده از shift register (در زبان پارسی معادل دارد؟) ضروری است. این آیسی انواع مختلف دارد ولی برای کار ما فقط نوعی که دادهها را بصورت سریال بگیرد و موازی در اختیار بگذارد مناسب است. (Seriell to Paralell) در مدار فرکانس سنج من از نوع 74HC164 استفاده کردهام. استفاده از این نوع قطعه تعداد پایههای لازم برای کنترل LCD را به حداقل میرساند.
در این شکل شما 4 نمونه از مدارات را میبینید که همه از Shiftregister استفاده میکنند و تفاوت آنان در تعداد پایه های لازم برای اینکار است. در تمامی این روشها LCD بصورت 4-بیتی کنترل میشود. اگر میخواهید بصورت 8-بیتی LCD را کنترل کنید یا باید از 2 آیسی shift register استفاده کنید یا shift register باید از 8-بیت بزرگتر باشد, مثلا 16-بیت. در این نوع مدارات از LCD فقط برای نوشتن و یا نشان دادن استفاده میشود (این حالتی است که معمولا کاربرد دارد). اگر مایل باشید که علامتهای داخل LCD یا حافظه داخلی را در این نوع مدار بخوانید باید از یک Shiftregister دیگر و یک یا 2 خط کنترل اضافه استفاده کنید. روش (C): برای کنترل ما به حداکثر 3 اتصال نیاز داریم: یکی برای داده(data), یکی takt و دیگری E ( نمودار C ) در این نوع میتوان LCD را در هر دو نوع از کنترل ( 4-bit Mode) یا ( 8-bit Mode) استفاده کنیم. اول ما 4 یا 8 بیت داده(D7...D4) را بطور سری (serial) به آیسی 74HC174 منتقل میکنیم و بعد توسط خط E آنرا برای LCD فعال میکنیم. نمودار زمانی آن بدین صورت میتواند باشد. روش (D): برای کنترل ما به حداکثر 2 اتصال نیاز داریم: برای داده(takt/data) و دیگری E. در اینجا حالت بیت R/S را همراه 4-bit داده بصورت سریال منتقل میکنیم. در این روش LCD بصورت ( 4-bit Mode) کنترل میشود. روشهای (A) و (B): تفاوت این روشها با نوع C و D در این است که چون Busy-flag را میخوانیم باید از خط R/W نیز استفاده کنیم. برای اینکار باید بعد از اینکه داده ها به نشاندهنده منتقل شد, خط R/W را فعال کنیم () و بیت D7 را چک کنیم تا از آماده شدن LCD برای دریافت داده بعدی اطمینان حاصل کنیم. طرز کار :در این روشها از خاصیت شارژ و دشارژ شدن یک خازن استفاده میشود.میدانیم که ولتاژ روی یک خازن در هنگام پر و خالی شدن از یک لگاریتم طبیعی ( ln(x) ) پیروی میکند. بنابر تعریف برای دشارژ یا خالی شدن خازن داریم: دشارژ: Uc(t) = U0. e^(-t/τ) شارژ: Uc(t) = U0. ( 1 - e^(-t/τ) ) در این معادله Uc ولتاژ روی خازن در زمان t است, U0 ولتاژ قرارگرفته روی خازن در زمان t=0 است که اینجا برابر ولتاژ منبع تغذیه مساوی 5 ولت میباشد. تاو (τ) ثابت زمانی و t زمان مشاهده. در ادامه توضیحات باید بدانیم که صفر منطقی بین 0.8 تا 1.5 ولت و یک منطقی از 3.5 ولت به بالا تعریف شده. همانطور که در نمودار دیده میشود قبول کردن بیت در Shift-Register هنگام گذر از LOW به HIGH در ورودی پالس takt یا CLK اتفاق میافتد. اگر در این زمان ولتاژ روی ورودی Data کمتر از 1.5 ولت باشد آنرا صفر منطقی میبیند و اگر بزرگتر از 3.5 ولت باشد یک منطقی. نکتهای که باید در نظر داشت این است که اگر بیت مورد نظر Low باشد باید بعد از اینکه پالس CLK به حالت High رسیده, حداقل به اندازه زمان t2 صبر شود تا دوباره خازن شارژ شود! برای محاسبه مقدار مقاومت و خازن میتوان از دو راه استفاده کرد. اولین راه اینست که خود مقدار آنان را مشخص میکنیم, بعد از آن ثابت زمانی را که برابر τ = R . C است محاسبه کرده و بر اساس آن برنامه اینترفیس را مینویسیم. نقش مقاومت R علاوه بر تغییر ثابت زمانی مداراینست که, در زمان صفر که خازن خالی هست مانند یک محدود کننده جریان عمل میکند و باید با توجه به قدرت پین خروجی و اینکه چه مقدار جریان میتواند تحمل کند باید محاسبه یا در نظر گرفته شود. مثال اول: فرض میکنیم R=1000 اهم و C=1µF است, بنابراین مقدار ثابت زمانی خازن τ = R.C = 1000.0,000001= 0,001 = 1mS است. برای حالت یک منطقی باید زمانی که پالس CLK به حالت LOW میرود, خازن نباید کمتر از 3.5 ولت خالی یا دشارژ شود بنابر تعریف برای دشارژ یا خالی شدن خازن داریم: Uc(t) = U0. e^(-t/τ) در این معادله Uc ولتاژ روی خازن در زمان t است, U0 ولتاژ قرارگرفته روی خازن در زمان t=0 است که اینجا برابر ولتاژ منبع تغذیه مساوی 5 ولت میباشد. تاو (τ) ثابت زمانی و t زمان مشاهده. با مقداری جابجایی ریاضی : (Uc/U0) = e^(-t/τ) (Uc/U0) = e^(-t/τ) ln(Uc/U0) = -t/τ میتوانیم زمان را بدین صورت: t = -τ . ln(Uc/U0) محاسبه کرد. با قرار دادن مقادیر t = -0.001 . ln(3.5/5) = 0,356 mS خواهد بود, این برابر زمان t0 است. برای حالت صفر منطقی, زمانی که پالس CLK به حالت LOW میرود, خازن نباید بیشتر از 0.5 ولت باشد تا بتوان با اطمینان از صفر منطقی سخن گفت. با قرار دادن مقادیر t = -0.001 . ln(0.5/5) = 2,3 mS خواهد بود, این زمان t2 است. و زمان t1 باید حداقل برابر t2 باشد. حالا با داشتن این 3 زمان میتوان کد مربوط به اینترفیس سریال را نوشت. مثال دوم: فرض میکنیم که اوسیلاتور مدار ما 16 مگاهرتز باشد, این یعنی سیکل داخلی برابر با 4 مگاهرتز و پریود آن 250 نانوثانیه خواهد بود. پس برای پالس CLK ما به 2 سیکل داخلی یعنی 500 نانوثانیه نیاز داریم. (1سیکل CLK را Low میکنیم و سیکل بعدی آنرا High) این برابر زمان t0 است. در طی این زمان خازن نباید کمتر از 3.5 ولت خالی شود, پس میتوانیم مقدار ثابت زمانی را الان محاسبه کنیم. τ = -t . ln(Uc/U0) با قرار دادن مقادیر τ = -500 nS . ln(3,5/5) = 0,178 µS خواهد بود. حالا میتوانیم زمان t2 را محاسبه کنیم. t2 = -0.178µS . ln(0.5/5) = 0,410 µS با داشتن ثابتزمانی و انتخاب یکی از دو قطعه (یا مقاومت یا خازن) میتوان دیگری را محاسبه نمود. اگر مقدار مقاومت را 1000 اهم بگیریم, خازن برابر است با 178,3 pF همانطور که دیده میشود با روش دوم ما میتوانیم اینترفیس را با حداکثر سرعت برنامهریزی کنیم. در عمل شما باید تلرانس (تفاوت ارزشی) مقاومت و خازن را هم در نظر داشته باشید. روش سوم (روش ابدایی من):
این شکل کلی مدار است. این مدار کنترل LCD با یک خط است. این مدار ترتیب زمانی را که برای نوشتن لازم است, بر طبق ( نمودار 1 ) اتوماتیک میکند. این عمل با ظاهر شدن یک بیت در تاکت آخر اتفاق میافتد. در مدار فرکانس سنج چون من از یک PIC دارای 8 پایه استفاده کردم, پایه های کافی برای نشاندهنده وجود نداشت بنابراین باید از حداقل پایه های ممکن استفاده میشد. برای این مدار یک فیبر چاپی هم درست کردم و از کارکرد آن بسیار راضی! روش سوم (روش ابدایی من):
این تصاویر مدار آزمایشی است . هم نوع دست ساز و نوع دیگر که برایش فیبرچاپی کوچکی درست کردم. از دیود میتوان صرفه جویی کرد, این فقط برای آن است که زمانهای شارژ و دشارژ تقریبا مساوی باشند. با این روش میتوان به حداکثر سرعتی که نشاندهنده برای کار لازم دارد نیز رسید. در اینجا اول مقدار مقاومت R1 را با توجه به اینکه خروجی PIC میتواند حداکثر 20 میلی آمپر جریان در اختیار بگذارد محاسبه میکنیم. ما در زمان صفر حداکثر جریان را به 15 میلی آمپر محدود میکنیم, بنابراین مقدار R برابر است با : ( 5V/15mA = 330R ) مقدار خازن C1 بستگی دارد به مقدار اوسیلاتور مدار و زمانبندی و تعداد دستورات در تابعی که بیت ها را بصورت سریال ارسال میکند. حال اگر فرض کنیم که اوسیلاتور ما 16 مگاهرتز باشد پس زمان سیکل داخلی ( Tcyc ) برابر 250 نانو ثانیه میباشد.این زمانی است که میکروکنترلر برای اجرای یک دستور لازم دارد(البته این زمان به چهار قسمت تقسیم میشود Q1 تا Q4 که در Q1 و Q2 دستور بعدی ضبط میشود و در Q3 و Q4 دستور فعال اجرا میشود) برای سهولت فرض میکنیم که دستور فعال در پایان این زمان( 250 نانو ثانیه) اجرا میشود. حال به تابع ( Send_LCD_Data )نگاه میکنیم: عملکرد این تابع بدینصورت است که 6 بیت را بصورت متوالی در روی پایه میکروکنترلر قرار میدهد. (برای بزرگتر شدن روی عکس کلیک کنید)
در سطر 1 و 2 ثابت عددی برای شمارش را مشخص میکنیم ( اینجا 6 بیت ) در سطر 3 اولین بیت را بسمت راست جابجا میکنیم. این بیت به Carry بیت منتقل میشود. در سطر 4 پایه یا پین تعریف شده را به حالت صفر میبریم( اینجا Port C / RC2 ) . زمان اجرای این دستور 250 نانو ثانیه است. در سطر 5 مشخص میکنیم که بیت وارد شده در Carry صفر یا یک است. این دستور بستگی به اینکه بیت صفر یا یک باشد به یک یا 2 سیکل داخلی (Tcyc) احتیاج است. این بیت میتواند دارای دو حالت باشد: حالت اول: بیت برابر یک است در این حالت به سطر 7 پرش میشود و به 2 Tcyc برابر 500 نانو ثانیه احتیاج است. در سطر 7 پایه یا پین تعریف شده را به حالت یک منطقی میبریم( اینجا / RC2 Port C ). زمان اجرای این دستور 250 نانو ثانیه است. بنابراین برای بیت یک منطقی زمان سپری شده برابر با 250nS + 500nS + 250nS = 1000 nS نانو ثانیه است و در این زمان ولتاژ روی پایه مورد نظر نباید کمتر از 3.5 ولت(حداقل ولتاژ برای یک منطقی) شود. بر اساس این زمان باید مقدار خازن C1 محاسبه شود. Uc(t) = U0. e^( -t / τ ) τ = -t / ln( Uc(t) / U0 ) τ = -1µS / ln( 3,5V / 5V ) τ = 2,8 µS τ = R * C C = τ / R C = 8,5 nF با انتخاب نزدیکترین عدد که 10 nF است ما مقداری رزرو هم داریم. حال با داشتن این مقادیر برای مقاومت و خازن میتوانیم ثابت زمانی را محاسبه کنیم که برابر است با : Τ = 330Ω * 10nF = 3,3 µS با این انتخاب ثابت خازنی ما برابر با 3,3µs است و زمانی که با این مقادیر لازم است تا ولتاژ خازن به 3,5V برسد تقریبا برابر است با 1,18 µS که بیشتر از زمانی است که برای اجرای دستورات برای بیت یک منطقی مورد نیاز بود.(1000nS) و این بدین معنی است که ولتاژ روی خازن در طی مدت دستورات کمتر از 3.5 ولت نخواهد شد. حالت دوم: بیت برابر صفر است زمانی را که لازم است تا خازن به صفر منطقی ( حداکثر 1,5V ) برسد برابر است با : t = -τ . ln( Uc(t) / U0 ) t = -3,3 µS . ln( 1,5V / 5V ) t = 3,97 µS برای اطمینان حد صفر منطقی را 0,8V در نظر میگیریم در این صورت : t = -3,3 µS . ln( 0,8V / 5V ) t = 6,05 µS از زمانی که در سطر 4 پایه یا پین مورد نظر را به صفر میکشیم تا سطر 7 که آنرا به یک منطقی تغییر میدهیم باید این زمان سپری شده باشد تا shift register آنرا صفر منطقی ببیند! حال با توجه به زمانهای محاسبه شده میتوانیم تابع تاخیری را بنویسیم که باید برابر با تاخیر برای حالت صفر منطقی باشد. برای دقت بیشتر باید تاخیرات دستورها را نیز مدنظر داشت. زمانهای سپری شده در دستورات برابرند با: سطر 5 به 1 سیکل داخلی برابر 250 نانو ثانیه در سطر 6 برای پرش ( Call ) به 2 سیکل داخلی نیاز است 500 نانو ثانیه در تابع ( Delay_ZerroBit ) سطر 1 و 2 به 500 نانو ثانیه نیاز دارد. تاخیر در سطرهای 3 و 4 توسط شمارش معکوس ثابت Delay ایجاد میشود که برای هر شمارش به 3 سیکل داخلی برابر 750 nS نیاز است. برای خروج هم به 2 سیکل داخلی برابر 500 nS احتیاج است. بنابراین زمان کامل تاخیر برابر است با : t = ( Delay * 3 * Tcyc ) + 8 * Tcyc Delay = 6,05 µS - ( 8 * Tcyc ) / ( 3 * Tcyc ) Delay = 5,4 مقدار Delay را 6 در نظر میگیریم. با عدد 6 در مجموع, با احتساب ورود و خروج از تابع تقریبا 6,5 µS برای بیت صفر تاخیر ایچاد میکنیم.
بعد از اینکار به تابعی احتیاج داریم که یک بایت را در دو قسمت به تابع Send_LCD_Data( Byte LCD_Dbyte ) ارسال کند. اول قسمت بالای بایت و دوم قسمت پایین بایت ( 4-bit Mode) .
نشاندهنده LCD برای اجرای دستور نوشتن ( Write data to RAM ) به تقریبا حدود 40 µS احتیاج دارد,
این حداقل فاصله زمانی بین دو دستور است که باید رعایت شود.اگر در تابع Send_Char از زمان ورود تا زمان فرستادن نیم بایت دوم Send_L_Nible تعداد دستورات با سیکل داخلی را شمارش کنیم و در نظر بگیریم که کمترین زمان در حالتی است که تمامی بیت ها دارای ارزش یک منطقی هستند میبینیم که برای فرستادن 6 بیت به 209 سیکل داخلی نیاز میباشد و این زمان با یک اوسیلاتور 16 مگاهرتزی برابر است با 209*Tcyc = 52,25 µS . بنابراین میتوانیم هر دو نیم بایت را بدون تاخیر به LCD بفرستیم زیرا این زمان از زمانی که سازنده LCD برای اجرای دستور (40 µS) در نظر گرفته بیشتر میباشد. باید توجه کنید که این مقادیر و زمانها برای یک اوسیلاتور 16 مگاهرتزی محاسبه شده ولی از اوسیلاتور 14 تا 20 مگاهرتزی هم بدون تغییر قابل اجرا هستند, اگر از اوسیلاتوری بیشتر از 20 مگاهرتز یا کمتر از 14 مگاهرتز استفاده شود باید مقادیر خازن C1 و مقدار ثابت Delay دوباره محاسبه شود. با این مدار میتوان به سرعتی در حدود 9.5 کیلو بایت در ثانیه رسید. در این فیلم مدار آزمایشی نشان داده میشود.
امیدوارم که این پروژه برای شما مفید باشد. اگر سوالی یا پیشنهادی دارید از قسمت نظر شما استفاده کنید. |